home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / ldglx08 / ldglx08s.lzh / LDGLX.S < prev    next >
Text File  |  1997-09-20  |  56KB  |  2,486 lines

  1. *********************************************************************************
  2. *    GLx Loader                    <LDGLX.X Ver. 0.08>    *
  3. *********************************************************************************
  4.  
  5.     .include    doscall.mac
  6.     .include    iocscall.mac
  7.     .include    myconst.h
  8.  
  9.     .xref    _Gxput
  10.  
  11.     .text
  12.     .even
  13.  
  14. start:
  15.     lea.l    mysp(pc),sp        *スタックセット
  16.  
  17.     lea.l    16(a0),a0        *余分なメモリ開放
  18.     suba.l    a0,a1
  19.     move.l    a1,-(sp)
  20.     move.l    a0,-(sp)
  21.     DOS    _SETBLOCK
  22.     addq.l    #8,sp
  23.  
  24.     bsr    cmdchk            *コマンドラインの解析
  25.     bsr    buf_get            *バッファ確保
  26.     bsr    super            *スーパーモードへ
  27.     bsr    cursol_clr        *カーソル消す
  28.     bsr    name_get        *ファイル名を取得し処理する
  29.     bsr    user            *ユーザモードへ
  30.     bsr    buf_free        *バッファ開放
  31.     bsr    exit            *終了処理
  32.     DOS    _EXIT
  33.  
  34. *****************************************************************
  35. *    ファイル名を取得し、ファイルの読み込みを行う        *
  36. *****************************************************************
  37. name_get:
  38.     clr.w    file_cnt        *ファイル数のカウント初期化
  39.     move.l    buff_addr(pc),gr_addr    *画像アドレス初期化
  40.     bsr    pal_set            *パレットの初期化
  41.  
  42.     bsr    chkname            *ファイル名に対する前処理
  43.     bsr    chkext            *拡張子が省略されているかチェック
  44.  
  45.     move.w    #ARCHIVE,-(sp)        *最初のファイルを検索する
  46.     pea.l    arg1(pc)        *
  47.     pea.l    filbuf(pc)        *
  48.     DOS    _FILES            *
  49.     lea.l    10(sp),sp        *
  50.  
  51. loop:
  52.     tst.l    d0            *ファイルは見つかったか?
  53.     bmi    done            * 見つからなければ処理完了
  54.  
  55.     bsr    setpath            *得られたファイル名を
  56.                     * フルパスに再構成する
  57.  
  58.     bsr    main            *メイン処理
  59.  
  60.     tst.b    esc_flg            *エスケープ?
  61.     bne    done
  62.  
  63.     pea.l    filbuf(pc)        *つぎのファイルを検索する
  64.     DOS    _NFILES            *
  65.     addq.l    #4,sp            *
  66.  
  67.     bra    loop            *繰り返す
  68.  
  69. done:
  70.     bsr    rw_chk            *画面の描き直し
  71.     bsr    file_cnt_chk        *処理したファイル数のチェック
  72.     rts
  73.  
  74. *****************************************************************
  75. *    files実行に先立ってファイル名に前処理を加える        *
  76. *****************************************************************
  77. chkname:
  78.     pea.l    nambuf(pc)        *ファイル名を展開する
  79.     pea.l    arg1(pc)        *
  80.     DOS    _NAMECK            *
  81.     addq.l    #8,sp            *
  82.  
  83.     tst.l    d0            *d0<0なら
  84.     bmi    name_er            * ファイル名の指定に誤りがある
  85.  
  86.     beq    nowild            *d0=0ならワイルドカード指定なし
  87.  
  88.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  89.     bne    wild            * ワイルドカード指定あり
  90.  
  91. noname:                    *ファイル名が指定されていない場合
  92.     lea.l    arg1(pc),a0        *バッファarg1に
  93.     lea.l    nambuf(pc),a1        * nameckで展開したパス名+'*.GL?'
  94.     bsr    strcpy            * を再構成する
  95.     lea.l    kome0(pc),a1        *
  96.     bsr    strcpy            *
  97.  
  98. wild:                    *ワイルドカードが指定された場合
  99.                     *何もしなくてよい
  100. cknam0:
  101.     rts
  102.  
  103. nowild:                    *ワイルドカードが指定されていない場合
  104.     move.w    #SUBDIR,-(sp)        *サブディレクトリであると仮定して
  105.     pea.l    arg1(pc)        * 検索してみる
  106.     pea.l    filbuf(pc)        *
  107.     DOS    _FILES            *
  108.     lea.l    10(sp),sp        *
  109.     
  110.     tst.l    d0            *見つかったか?
  111.     bmi    cknam0            * 見つからなければファイルだろう
  112.  
  113.     lea.l    arg1(pc),a0        *バッファarg1に
  114.     lea.l    komekome(pc),a1        * もとのファイル名+'\*.GL?'
  115.     bsr    strcat            * を再構成する
  116.  
  117.     bra    chkname            *nameckでファイル名を展開するために
  118.                     * サブルーチン先頭に戻る
  119.  
  120. *****************************************************************
  121. *    files,nfilesで見付けたファイル名をフルパスに構成し直し    *
  122. *        arg1以降に格納する                *
  123. *****************************************************************
  124. setpath:
  125.     lea.l    arg1(pc),a0        *a0=コピー先
  126.     lea.l    nambuf(pc),a1        *a1=nameckで展開したパス名
  127.     bsr    strcpy            *コピーする
  128.     lea.l    filbuf(pc),a1        *a1=files,nfilesで見付けたファイル名
  129.     lea.l    30(a1),a1
  130.     bsr    strcpy            *連結する
  131.     rts
  132.  
  133. *****************************************************************
  134. *    文字列の連結および複写                    *
  135. *    リターン時a0は文字列末の00Hを指す            *
  136. *****************************************************************
  137. strcat:
  138.     tst.b    (a0)+            *(a0)は0か?
  139.     bne    strcat            *そうでなければ繰り返す
  140.     subq.l    #1,a0            *行きすぎたから1つ戻る
  141. strcpy:
  142.     move.b    (a1)+,(a0)+        *1文字ずつ
  143.     bne    strcpy            *終了コードまでを転送する
  144.     subq.l    #1,a0            *a0は進み過ぎている
  145.                     *a0は文字列末の00Hを指す
  146.     rts
  147.  
  148. *****************************************************************
  149. *    拡張子を補う                        *
  150. *****************************************************************
  151. chkext:
  152.     lea.l    arg1(pc),a0        *ファイル名のアドレス
  153.     lea.l    dext(pc),a1        *拡張子のアドレス
  154. chkext0:
  155.     cmp.b    #".",(a0)        *拡張子があるか
  156.     beq    chkext2
  157.     tst.b    (a0)+            *(a0)は0か?
  158.     bne    chkext0            *そうでなければ繰り返す
  159.     subq.l    #1,a0            *行きすぎたから1つ戻る
  160. chkext1:
  161.     move.b    (a1)+,(a0)+        *1文字転送
  162.     bne    chkext1            *終了コードまで繰り返す
  163. chkext2:
  164.     rts
  165.  
  166. *****************************************************************
  167. *    コマンドラインのチェックを行う                *
  168. *****************************************************************
  169. cmdchk:
  170.     lea.l    arg1(pc),a0        *a0=引数切り出し領域
  171.     addq.l    #1,a2            *a2=コマンドライン文字列先頭
  172.     move.w    #1,clr_mode        *画面クリアモードの初期値
  173.     clr.w    crt_mode        *画面モード初期値
  174.     clr.w    x_pos            *ロード座標の初期化
  175.     clr.w    y_pos
  176.  
  177. cmdchk0:
  178.     bsr    switch_chk        *スイッチのチェック
  179.  
  180.     tst.b    (a2)            *引数があるか?
  181.     beq    usage            *ないならファイル名が足りない
  182.     bsr    getarg            *ファイル名切り出し
  183.     bsr    switch_chk        *さらにスイッチのチェック
  184.     tst.b    (a2)            *引数があるか?
  185.     bne    usage            * あるなら引数が多い
  186. cmdchk1:
  187.     rts
  188.  
  189. *****************************************************************
  190. *    スペースを飛ばしつぎの引数先頭までポインタを進め    *
  191. *    スイッチがあれば処理してしまう                *
  192. *****************************************************************
  193. switch_chk:
  194.     bsr    skipsp            *スペースをスキップする
  195.     tst.b    (a2)            *まだスイッチがあるか?
  196.     beq    switch_chk2        *ないなら戻る(処理の振り分けを行う)
  197.  
  198.     cmpi.b    #'/',(a2)        *引数の先頭が
  199.     beq    switch_chk1        */,-であれば
  200.     cmpi.b    #'-',(a2)        *  スイッチ
  201.     beq    switch_chk1        *
  202.     bra    switch_chk2        *スイッチでないなら戻る
  203.  
  204. switch_chk1:
  205.     addq.l    #1,a2            *'/'や'-'の分ポインタを進める
  206.     tst.b    (a2)            *スイッチがあるか?
  207.     beq    usage            * ないなら使用方表示
  208.     move.b    (a2)+,d0        *1文字取り出す
  209.     bsr    toupper            *大文字に変換しておく
  210.  
  211.     cmpi.b    #'K',d0            *Kスイッチ?
  212.     beq    ksw            * そうなら分岐
  213.     cmpi.b    #'S',d0
  214.     beq    ssw
  215.     cmpi.b    #'C',d0
  216.     beq    csw
  217.     cmpi.b    #'L',d0
  218.     beq    lsw
  219.     cmpi.b    #'M',d0
  220.     beq    msw
  221.     cmpi.b    #'R',d0
  222.     beq    rsw
  223.     bra    usage            *無効なスイッチが指定された
  224.  
  225. ksw:
  226.     tst.b    kflg            *スイッチの二重指定チェック
  227.     bne    usage
  228.     st    kflg            *KスイッチON
  229.     bra    switch_chk        *まだスイッチがあるかもしれない
  230.  
  231. ssw:
  232.     bsr    ssw_ana
  233.     bra    switch_chk
  234.  
  235. csw:
  236.     bsr    csw_ana
  237.     bra    switch_chk
  238.  
  239. lsw:
  240.     bsr    lsw_ana
  241.     bra    switch_chk
  242.  
  243. msw:
  244.     tst.b    mflg
  245.     bne    usage
  246.     st    mflg
  247.     bra    switch_chk
  248.  
  249. rsw:
  250.     tst.b    rflg
  251.     bne    usage
  252.     st    rflg
  253.     bra    switch_chk
  254.  
  255. switch_chk2:
  256.     rts
  257.  
  258. *****************************************************************
  259. *    Sスイッチの解析                    *
  260. *****************************************************************
  261. ssw_ana:
  262.     tst.b    sflg            *Sスイッチの2重指定
  263.     bne    usage
  264.     st    sflg
  265.  
  266.     move.b    (a2),d0            *1文字取り出す
  267.     cmp.b    #' ',d0            *Sだけかな
  268.     beq    ssw_ana9        *画面モードの指定なし
  269.     bsr    num_read        *
  270.     cmp.w    crt_max(pc),d0        *
  271.     bhi    usage
  272.     move.w    d0,crt_mode
  273.     subq.l    #1,a2            *1文字戻す
  274. ssw_ana9:
  275.     rts
  276.  
  277. *****************************************************************
  278. *    Cスイッチの解析                    *
  279. *****************************************************************
  280. csw_ana:
  281.     tst.b    cflg            *Cスイッチの2重指定
  282.     bne    usage
  283.     st    cflg
  284.  
  285.     move.b    (a2),d0            *1文字取り出す
  286.     cmp.b    #' ',d0            *Cだけかな
  287.     beq    csw_ana9        *画面クリアモードの指定なし
  288.     bsr    num_read
  289.     cmp.w    #3,d0
  290.     bhi    usage
  291.     move.w    d0,clr_mode
  292.     subq.l    #1,a2            *1文字戻す
  293. csw_ana9:
  294.     rts
  295.  
  296. *****************************************************************
  297. *    Lスイッチの解析                    *
  298. *****************************************************************
  299. lsw_ana:
  300.     move.b    (a2),d0            *1文字取り出す
  301.     bsr    toupper            *大文字に変換しておく
  302.     cmp.b    #'C',d0            *LCかな
  303.     bne    lsw_ana1
  304.     tst.b    lflg            *Lスイッチも指定している
  305.     bne    usage
  306.     tst.b    lcflg            *LCスイッチの2重指定
  307.     bne    usage
  308.     st    lcflg            *LCスイッチオン
  309.     addq.l    #1,a2            *1文字進める
  310.     bra    lsw_ana9
  311. lsw_ana1:
  312.     cmp.b    #' ',d0            *Lだけかな
  313.     bne    lsw_ana2        *ロード座標を指定している
  314.     clr.w    x_pos            *ロード座標を0,0
  315.     clr.w    y_pos
  316.     bra    lsw_ana9
  317. lsw_ana2:
  318.     bsr    num_read        *Xチェック
  319.     cmp.w    #511,d0            *Xが511を越える時
  320.     bhi    but_pos
  321.     move.w    d0,x_pos
  322.     cmp.b    #',',-1(a2)
  323.     bne    usage
  324.     bsr    num_read        *Yチェック
  325.     cmp.w    #511,d0            *Yが511を越える時
  326.     bhi    but_pos
  327.     move.w    d0,y_pos
  328.     st    lflg            *Lスイッチオン
  329.     subq.l    #1,a2            *1文字戻す
  330. lsw_ana9:
  331.     rts
  332.  
  333. *****************************************************************
  334. *    ファイル名を切り出す                    *
  335. *****************************************************************
  336. getarg:
  337.     move.l    a0,-(sp)        *{レジスタ待避
  338. gtarg0:    tst.b    (a2)            *1)文字列の終端コードか
  339.     beq    gtarg1            *
  340.     cmpi.b    #SPACE,(a2)        *2)スペースか
  341.     beq    gtarg1            *
  342.     cmpi.b    #TAB,(a2)        *3)タブか
  343.     beq    gtarg1            *
  344. *    cmpi.b    #'-',(a2)        *4)ハイフンか
  345. *    beq    gtarg1            *
  346.     cmpi.b    #'/',(a2)        *5)スラッシュ
  347.     beq    gtarg1            *
  348.     move.b    (a2)+,(a0)+        * が現れるまで転送を
  349.     bra    gtarg0            * 繰り返す
  350. gtarg1:    clr.b    (a0)            *文字列終端コードを書き込む
  351.     movea.l    (sp)+,a0        *}レジスタ復帰
  352.     rts
  353.  
  354. *****************************************************************
  355. *    スペース・TABをスキップする                *
  356. *****************************************************************
  357. skipsp0:
  358.     addq.l    #1,a2
  359. skipsp:
  360.     cmpi.b    #$20,(a2)
  361.     beq    skipsp0
  362.     cmpi.b    #$09,(a2)
  363.     beq    skipsp0
  364.     rts
  365.  
  366. *****************************************************************
  367. *    小文字→大文字変換ルーチン                *
  368. *****************************************************************
  369. toupper:
  370.     cmpi.b    #'a',d0
  371.     bcs    toupr0
  372.     cmpi.b    #'z'+1,d0
  373.     bcc    toupr0
  374.     subi.b    #$20,d0
  375. toupr0:
  376.     rts
  377.  
  378. *****************************************************************
  379. *    数字の解析    d0に数字を返す                *
  380. *****************************************************************
  381. num_read:
  382.     clr.w    d0
  383. num_read0:
  384.     clr.w    d1
  385.     move.b    (a2)+,d1
  386.     sub.b    #'0',d1
  387.     cmp.b    #10,d1
  388.     bcc.b    num_read1
  389.     mulu    #10,d0
  390.     add.w    d1,d0
  391.     bra.b    num_read0
  392. num_read1:
  393.     rts
  394.  
  395. *****************************************************************
  396. *    メイン処理                        *
  397. *****************************************************************
  398. main:
  399.     sf    skip_flg        *スキップフラグ初期化
  400.     lea.l    arg1(pc),a0        *ファイル名セット
  401.     bsr    file_open        *ファイルオープン
  402.  
  403.     bsr    file_size        *ファイルサイズをチェック
  404.     move.l    d6,fi_size
  405.  
  406.     bsr    ext_chk            *拡張子とファイルサイズのチェック
  407.     tst.b    skip_flg
  408.     bne    main8
  409.  
  410.     move.l    buff_size(pc),d0    *メモリチェック
  411.     cmp.l    fi_size(pc),d0
  412.     bcs    main9
  413.  
  414.     bsr    crtmode_set        *画面モードの設定
  415.     bsr    scroll_set        *スクロール変数の設定
  416.     bsr    lsw_chk            *ロード座標・センタリングチェック
  417.  
  418.     tst.b    int_flg            *1回目のグラフィック初期化ここで行う
  419.     bne    main2
  420. *    bsr    gr_off            *グラフィック画面オフ
  421.     bsr    scr_int            *画面の初期化
  422.     bsr    crtmode_int        *画面モードの初期化
  423.     bsr    scroll_int        *スクロール座標の初期化
  424.     bsr    gr_int            *グラフィック画面の初期化チェック
  425. main2:
  426.     movea.l    buff_addr(pc),a4    *ファイル読む
  427.     move.l    fi_size(pc),d6
  428.     bsr    file_read
  429.     bsr    file_close        *ファイルクローズ
  430.  
  431.     tst.b    int_flg            *2回目以降のグラフィック初期化ここで行う
  432.     beq    main3
  433.     bsr    gr_off            *グラフィック画面オフ
  434. *    bsr    crtmode_int        *画面モードの初期化
  435.     bsr    scroll_int        *スクロール座標の初期化
  436.     bsr    gr_int            *グラフィック画面の初期化チェック
  437. main3:
  438.     bsr    gr_on            *グラフィック画面オン
  439.     bsr    inf_mode        *
  440.     bsr    bit24_prt        *最初の1画面表示
  441.  
  442.     bsr    scroll            *グラフィックをスクロール
  443.     add.w    #1,file_cnt        *ファイル数のカウント+1
  444.     rts
  445.  
  446. main8:
  447.     bsr    file_close
  448.     rts
  449.  
  450. main9:
  451.     bsr    file_close
  452.     bsr    no_buff2
  453.     st    skip_flg
  454.     rts
  455.  
  456. *****************************************************************
  457. *    拡張子のチェック                    *
  458. *****************************************************************
  459. ext_chk:
  460.     lea.l    arg1(pc),a0
  461.     lea.l    ext_buff(pc),a1
  462.     clr.l    (a1)
  463.  
  464.     move.l    #64+21-1,d0        *
  465. ext_chk0:
  466.     cmp.b    #'.',(a0)+
  467.     beq    ext_chk1
  468.     dbra.w    d0,ext_chk0
  469.     bra    not_ext
  470.  
  471. ext_chk1:
  472.     subq.l    #1,a0
  473.     move.b    (a0)+,d0        *拡張子コピー
  474.     bsr    toupper
  475.     move.b    d0,(a1)+
  476.     move.b    (a0)+,d0
  477.     bsr    toupper
  478.     move.b    d0,(a1)+
  479.     move.b    (a0)+,d0
  480.     bsr    toupper
  481.     move.b    d0,(a1)+
  482.     move.b    (a0)+,d0
  483.     bsr    toupper
  484.     move.b    d0,(a1)+
  485.     subq.l    #4,a1
  486.  
  487.     cmp.l    #".GL0",(a1)        *拡張子チェック
  488.     beq    ext_gl0
  489.     cmp.l    #".GL3",(a1)
  490.     beq    ext_gl3
  491.     cmp.l    #".GLX",(a1)
  492.     beq    ext_glx
  493.     cmp.l    #".GLM",(a1)
  494.     beq    ext_glm
  495.  
  496.     cmp.l    #256*256*2,fi_size    *ファイルサイズでチェック
  497.     beq    ext_gl0
  498.     cmp.l    #512*512*2,fi_size
  499.     beq    ext_gl3
  500.     bra    not_ext
  501.  
  502. ext_gl0:
  503.     move.w    #256,yoko
  504.     move.w    #256,tate
  505.     bra    ext_chk9
  506.  
  507. ext_gl3:
  508.     move.w    #512,yoko
  509.     move.w    #512,tate
  510.     bra    ext_chk9
  511.  
  512. ext_glx:
  513.     movea.l    buff_addr(pc),a4    *ファイル読む
  514.     moveq.l    #4,d6
  515.     bsr    file_read
  516.  
  517.     move.w    (a4)+,d0
  518.     ror.w    #8,d0
  519.     move.w    d0,yoko
  520.     move.w    (a4)+,d0
  521.     ror.w    #8,d0
  522.     move.w    d0,tate
  523.     bra    ext_chk9
  524.  
  525. ext_glm:
  526.     movea.l    buff_addr(pc),a4    *ファイル読む
  527.     moveq.l    #16,d6
  528.     bsr    file_read
  529.  
  530.     cmp.l    #"GR65",(a4)
  531.     bne    not_glx
  532.     move.w    12(a4),yoko
  533.     move.w    14(a4),tate
  534. *    bra    ext_chk9
  535.  
  536. ext_chk9:
  537.     move.w    yoko(pc),d0        *1ラインのバイト数
  538.     add.w    d0,d0
  539.     move.w    d0,line_byte
  540.  
  541.     mulu.w    tate(pc),d0        *画像のサイズ
  542.     move.l    d0,fi_size
  543.     rts
  544.  
  545. not_ext:
  546.     lea.l    arg1(pc),a0        *スキップする
  547.     bsr    mesput
  548.     lea.l    not_ext_mes(pc),a0
  549.     bsr    mesput
  550.     st    skip_flg
  551.     rts
  552.  
  553. not_glx:
  554.     lea.l    arg1(pc),a0        *GLxでない
  555.     bsr    mesput
  556.     lea.l    not_glx_mes(pc),a0
  557.     bsr    mesput
  558.     st    skip_flg
  559.     rts
  560.  
  561. *****************************************************************
  562. *    ロード座標のチェック                    *
  563. *****************************************************************
  564. lsw_chk:
  565.     tst.b    lflg            *Lスイッチ指定
  566.     bne    l_chk            *指定あり
  567.     tst.b    lcflg            *LCスイッチ指定
  568.     bne    lc_chk            *指定あり
  569.     rts
  570.  
  571. l_chk:
  572.     move.w    x_pos(pc),d0        *横にはみ出るか
  573.     beq    l_chk1
  574.     add.w    yoko(pc),d0
  575.     cmp.w    crt_x(pc),d0
  576.     bhi    but_pos            *はみ出る
  577. l_chk1
  578.     move.w    y_pos(pc),d0        *縦にはみ出るか
  579.     beq    l_chk2
  580.     add.w    tate(pc),d0
  581.     cmp.w    crt_y(pc),d0
  582.     bhi    but_pos            *はみ出る
  583. l_chk2
  584.     rts
  585.  
  586.  
  587. lc_chk:
  588.     clr.w    x_pos            *ロード座標を初期化
  589.     clr.w    y_pos
  590.  
  591.     move.w    crt_x(pc),d0        *X方向のセンタリング
  592.     sub.w    yoko(pc),d0
  593.     bmi    lc_chk1
  594.     lsr.w    #1,d0            *d0を1/2
  595.     move.w    d0,x_pos
  596. lc_chk1:
  597.     move.w    crt_y(pc),d0        *Y方向のセンタリング
  598.     sub.w    tate(pc),d0
  599.     bmi    lc_chk2
  600.     lsr.w    #1,d0            *d0を1/2
  601.     move.w    d0,y_pos
  602. lc_chk2:
  603.     rts
  604.  
  605. *****************************************************************
  606. *    スクロール画面の初期化                    *
  607. *****************************************************************
  608. scroll_int:
  609.     clr.w    d2            *スクロール座標初期化
  610.     clr.w    d3
  611.     bsr    x_set
  612.     bsr    y_set
  613.     rts
  614.  
  615. *****************************************************************
  616. *    画面モードの設定                    *
  617. *****************************************************************
  618. crtmode_set:
  619.     move.w    #$03,vctr_r0
  620.     move.w    #$2f,vctr_r2
  621.     rts
  622.  
  623. *****************************************************************
  624. *    スクロール変数の設定                    *
  625. *****************************************************************
  626. scroll_set:
  627.     lea.l    dot_tbl(pc),a0        *ドット数テーブル
  628.     move.w    crt_mode(pc),d0
  629.     add.w    d0,d0
  630.     add.w    d0,d0
  631.     move.l    0(a0,d0.w),a0
  632.  
  633.     move.w    (a0),crt_x        *CRTのXドット数
  634.     move.w    2(a0),crt_y        *     Yドット数
  635.  
  636.     move.w    yoko(pc),d0        *横スクロール出来るドット数を計算
  637.     sub.w    crt_x(pc),d0
  638.     bpl    scroll_set0
  639.     clr.w    d0
  640. scroll_set0:
  641.     move.w    d0,x_max
  642.  
  643.     move.w    tate(pc),d0        *縦スクロール出来るドット数を計算
  644.     sub.w    crt_y(pc),d0
  645.     bpl    scroll_set1
  646.     clr.w    d0
  647. scroll_set1:
  648.     move.w    d0,y_max
  649.     rts
  650.  
  651. *****************************************************************
  652. *    画面の初期化を行う                    *
  653. *****************************************************************
  654. scr_int:
  655.     st    int_flg            *画面の初期化は一回だけ
  656.  
  657.     move.w    clr_mode(pc),d0        *テキスト画面消去の指定があるか
  658.     btst.l    #0,d0
  659.     beq    scr_int9        *指定無し
  660.  
  661.     IOCS    _MS_CUROF        *マウスカーソル消す
  662.     moveq.l    #0,d1            *ソフトキーボード消す
  663.     moveq.l    #0,d2
  664.     IOCS    _SKEY_MOD
  665.     bsr    func_off        *ファンクションキー消す
  666.     bsr    text_clr        *テキストクリア
  667.     move.w    #$1e,d1            *カーソルをHOMEポジションへ
  668.     IOCS    _B_PUTC
  669. scr_int9:
  670.     rts
  671.  
  672. *****************************************************************
  673. *    画面のモードの初期化を行う                *
  674. *****************************************************************
  675. crtmode_int:
  676.     move.w    vctr_r0(pc),$e82400    *色モード・実画面サイズ設定
  677.     move.w    #$06e4,$e82500        *画面の優先順位
  678.  
  679.     cmp.w    #2,clr_mode        *グラフィック画面消去の指定
  680.     bcs    crtmode_int1        *指定無し
  681.  
  682.     move.w    #$0020,$e82600        *GRoff・TEXTon
  683.     bra    crtmode_int2
  684. crtmode_int1:
  685.     move.w    vctr_r2(pc),$e82600    *GR・TEXT画面オン
  686. crtmode_int2:
  687.     bsr    v_wait
  688.     bsr    crtc_set        *crtcレジスタ設定
  689.     rts
  690.  
  691. *****************************************************************
  692. *    グラフィック画面の消去                    *
  693. *****************************************************************
  694. gr_int:
  695.     cmp.w    #2,clr_mode        *グラフィック画面消去の指定が無い時は無視
  696.     bcs    gr_int9            *指定無し
  697.  
  698. gr_int0:
  699.     cmp.w    #1,crt_mode        *15kHzはMPUクリア
  700.     beq    gr_int1
  701.  
  702.     tst.b    mflg            *強制MPUクリア?
  703.     beq    gr_int3
  704.  
  705. gr_int1:
  706.     movem.l    d0-d7/a0-a6,-(sp)
  707.  
  708.     moveq.l    #0,d0            *レジスタクリア
  709.     move.l    d0,d1
  710.     move.l    d0,d2
  711.     move.l    d0,d3
  712.     move.l    d0,d4
  713.     move.l    d0,d5
  714.     move.l    d0,d6
  715.     move.l    d0,d7
  716.     movea.l    d0,a1
  717.     movea.l    d0,a2
  718.     movea.l    d0,a3
  719.     movea.l    d0,a4
  720.     movea.l    d0,a5
  721.     movea.l    d0,a6
  722.  
  723.     movea.l    #GRAM_MAX,a0
  724.     move.w    #512,line_cnt
  725.  
  726. gr_int2:
  727.     movem.l    d0-d7/a1-a6,-(a0)    *14*4=56
  728.     movem.l    d0-d7/a1-a6,-(a0)
  729.     movem.l    d0-d7/a1-a6,-(a0)
  730.     movem.l    d0-d7/a1-a6,-(a0)
  731.     movem.l    d0-d7/a1-a6,-(a0)
  732.     movem.l    d0-d7/a1-a6,-(a0)
  733.     movem.l    d0-d7/a1-a6,-(a0)
  734.     movem.l    d0-d7/a1-a6,-(a0)
  735.     movem.l    d0-d7/a1-a6,-(a0)
  736.     movem.l    d0-d7/a1-a6,-(a0)
  737.     movem.l    d0-d7/a1-a6,-(a0)
  738.     movem.l    d0-d7/a1-a6,-(a0)
  739.     movem.l    d0-d7/a1-a6,-(a0)
  740.     movem.l    d0-d7/a1-a6,-(a0)
  741.     movem.l    d0-d7/a1-a6,-(a0)
  742.     movem.l    d0-d7/a1-a6,-(a0)
  743.     movem.l    d0-d7/a1-a6,-(a0)
  744.     movem.l    d0-d7/a1-a6,-(a0)
  745.     movem.l    d0-d3,-(a0)
  746.     subq.w    #1,line_cnt
  747.     bne    gr_int2
  748.  
  749.     movem.l    (sp)+,d0-d7/a0-a6
  750.     rts
  751.  
  752. gr_int3:
  753.     move.w    $e8002a,-(sp)        *ハードウェアクリア
  754.     bsr    v_wait
  755.     move.w    #$0f,$e8002a
  756.     move.b    #$02,$e80481
  757.     bsr    v_wait
  758.     bsr    v_wait
  759.     bsr    v_wait
  760.     move.w    (sp)+,$e8002a
  761. gr_int9:
  762.     rts
  763.  
  764. *****************************************************************
  765. *    グラフィックのオン                    *
  766. *****************************************************************
  767. gr_on:
  768.     cmp.w    #2,clr_mode        *グラフィック画面消去の指定が無い時は無視
  769.     bcs    gr_on1
  770. gr_on0:
  771.     bsr    v_wait
  772.     ori.w    #$002f,$e82600        *GRon・TEXTon
  773. gr_on1:
  774.     rts
  775.  
  776. *****************************************************************
  777. *    グラフィックのオフ                    *
  778. *****************************************************************
  779. gr_off:
  780.     cmp.w    #2,clr_mode        *グラフィック画面消去の指定が無い時は無視
  781.     bcs    gr_off1
  782. gr_off0:
  783.     bsr    v_wait
  784.     andi.w    #$ffe0,$e82600        *GRoff
  785. gr_off1:
  786.     rts
  787.  
  788. *****************************************************************
  789. *    標準パレットの設定                    *
  790. *****************************************************************
  791. pal_set:
  792.     moveq.l    #$0001,d0
  793.     move.l    #$0202,d1
  794.     movea.l    #GPAL,a0
  795.  
  796.     moveq.l    #512/4-1,d2
  797. pal_set1:
  798.     move.w    d0,(a0)+
  799.     move.w    d0,(a0)+
  800.     add.l    d1,d0
  801.     dbra.w    d2,pal_set1
  802.     rts
  803.  
  804. *****************************************************************
  805. *    画像データを一気に表示する                *
  806. *****************************************************************
  807. bit24_prt:
  808.     move.w    x_pos(pc),gram_x    *表示開始座標
  809.     move.w    y_pos(pc),gram_y
  810.  
  811.     clr.w    glx_x
  812.     clr.w    glx_y
  813.  
  814.     move.w    yoko(pc),d0
  815.     cmp.w    #512,d0            *横ドット数が512を超えるか
  816.     bls    bit24_prt1
  817.     move.w    #512,d0
  818. bit24_prt1:
  819.     move.w    d0,glx_xd
  820.     move.w    d0,x_line
  821.  
  822.     move.w    tate(pc),d0
  823.     cmp.w    #512,d0            *横ドット数が512を超えるか
  824.     bls    bit24_prt2
  825.     move.w    #512,d0
  826. bit24_prt2:
  827.     move.w    d0,glx_yd
  828.     move.w    d0,y_line
  829.  
  830.     bsr    get_glx_addr
  831.     bsr    get_gram_addr
  832.  
  833.     tst.b    mflg
  834.     bne    bit24_prt3
  835.     bsr    dma_move        *DMAで表示
  836.     bra    bit24_prt4
  837. bit24_prt3:
  838.     bsr    g24            *MPUで表示
  839. bit24_prt4:
  840.     rts
  841.  
  842. *****************************************************************
  843. *    DMAを使ってグラフィックへ転送する            *
  844. *****************************************************************
  845. dma_move:
  846.     move.w    glx_yd(pc),d0        *転送サイズ縦
  847.     move.w    glx_xd(pc),d1        *転送サイズ横
  848.     movea.w    line_byte(pc),a3    *転送元画像の横サイズ
  849.  
  850.     sub.w    #1,d0            *縦ライン-1
  851.  
  852.     move.b    #$FF,CSR2
  853.     move.b    #8,DCR2
  854.  
  855.     btst.l    #0,d1            *横ライン数が偶数か
  856.     beq    dma_move0        *そう
  857.     move.b    #$11,OCR2        *ワード転送
  858.     bra    dma_move1
  859. dma_move0:
  860.     move.b    #$21,OCR2        *ロングワード転送
  861.     lsr.w    #1,d1            *d1を1/2
  862. dma_move1:
  863.     move.b    #%0_000_0101,SCR2
  864.     move.b    #3,CPR2
  865.     clr.b    CCR2
  866.     move.b    #5,DFC2
  867.     move.b    #5,MFC2
  868. dma_move2:
  869.     move.w    d1,MTC2            *転送サイズ
  870.     move.l    a1,MAR2            *転送元
  871.     move.l    a2,DAR2            *転送先
  872.     move.b    #$80,CCR2
  873. dma_move3:
  874.     tst.w    MTC2
  875.     bne    dma_move3
  876.     move.b    #$FF,CSR2
  877.     adda.l    a3,a1            *転送元アドレス更新
  878.     lea.l    1024(a2),a2        *転送先アドレス更新
  879.     dbra.w    d0,dma_move2
  880.  
  881.     rts
  882.  
  883. *****************************************************************
  884. *    スクロール制御                        *
  885. *****************************************************************
  886. scroll:
  887.     sf    esc_flg            *フラグ初期化
  888.     sf    next_flg
  889.     sf    resize_flg
  890.     sf    inkey_flg1
  891.     sf    inkey_flg2
  892.     sf    inkey_flg3
  893.  
  894.     moveq.l    #0,d2            *スクロール座標初期化
  895.     moveq.l    #0,d3
  896.     clr.w    x_old
  897.     clr.w    y_old
  898.  
  899.     bsr    down_demo
  900.     bsr    right_demo
  901.  
  902.     tst.b    kflg            *キー入力待ち
  903.     beq    scroll8            *指定無し
  904.  
  905. scroll2:
  906.     bsr    key_chk            *キー入力チェック
  907. *    bsr    mouse_chk        *マウスのキー入力チェック
  908.  
  909.     tst.b    esc_flg            *エスケープ入力
  910.     bne    scroll9
  911.     tst.b    next_flg        *ネクスト入力
  912.     bne    scroll9
  913.     tst.b    resize_flg        *縮小表示
  914.     bne    scroll6
  915.  
  916.     bsr    cursor_chk        *カーソル入力チェック
  917.     bsr    tenkey_chk        *テンキー入力チェック
  918.     bsr    mouse_chk        *マウス入力チェック
  919.     bsr    go_scroll        *スクロール実行
  920.  
  921.     bsr    v_wait            *手抜き
  922.     bra    scroll2            *キー入力に戻る
  923.  
  924. scroll6:                *一画面表示
  925.     bsr    gr_off0
  926.     bsr    gr_int0
  927.     bsr    gr_on0
  928.     bsr    scroll_int
  929.     bsr    resize
  930. scroll6_:
  931.     bsr    key_chk
  932.     bsr    mouse_chk
  933.     tst.b    esc_flg
  934.     bne    scroll9
  935.     tst.b    next_flg
  936.     bne    scroll9
  937.     tst.b    resize_flg
  938.     bne    scroll6_
  939.  
  940. scroll7:                *書き戻し
  941.     bsr    gr_off0
  942.     bsr    gr_int0
  943.     bsr    gr_on0
  944.     bsr    rewrite
  945.     bra    scroll2
  946.  
  947. scroll8:
  948.     bsr    key_chk            *ESCくらいは入力チェック
  949.     bsr    mouse_chk        *マウスのキー入力チェック
  950.  
  951. scroll9:
  952.     rts
  953.  
  954. *****************************************************************
  955. *    キー入力チェック                    *
  956. *****************************************************************
  957. key_chk:
  958.     movea.w    #$800,a0
  959.     btst.b    #1,(a0)            *ESCが押されたか?
  960.     beq    key_chk_        *押されていない
  961.     st    esc_flg            *ESCスイッチON
  962.     bra    key_chk9
  963.  
  964. key_chk_:
  965.     btst.b    #7,1(a0)        *BSが押されたか?
  966.     beq    key_chk0        *押されていない
  967.     st    esc_flg            *ESCスイッチON
  968.     bra    key_chk9
  969.  
  970. key_chk0:
  971.     btst.b    #5,3(a0)        *RETURNが押されたか?
  972.     beq    key_chk1        *押されていない
  973.     st    next_flg        *NEXTスイッチON
  974.     bra    key_chk9
  975.  
  976. key_chk1:
  977.     btst.b    #5,6(a0)        *SPACEが押されたか?
  978.     beq    key_chk2
  979.     st    next_flg
  980.     bra    key_chk9
  981.  
  982. key_chk2:
  983.     btst.b    #6,9(a0)        *ENTERが押されたか?
  984.     beq    key_chk3
  985.     st    next_flg
  986.     bra    key_chk9
  987.  
  988. key_chk3:
  989.     btst.b    #6,6(a0)        *HOMEが押されたか?
  990.     beq    key_chk4
  991.     tst.b    inkey_flg1
  992.     bne    key_chk9
  993.     st    inkey_flg1
  994.     bsr    inf_change        *情報表示の変更
  995.     bra    key_chk9
  996.  
  997. key_chk4:
  998.     btst.b    #2,7(a0)        *UNDOが押されたか?
  999.     beq    key_chk5
  1000.     tst.b    inkey_flg1
  1001.     bne    key_chk9
  1002.     st    inkey_flg1
  1003.     not.b    resize_flg
  1004.     bra    key_chk9
  1005.  
  1006. key_chk5:
  1007.     btst.b    #1,7(a0)        *ROLL DOWNが押されたか?
  1008.     beq    key_chk6
  1009.     tst.b    inkey_flg1
  1010.     bne    key_chk9
  1011.     st    inkey_flg1
  1012.     bsr    crt_change0
  1013.     bra    key_chk9
  1014.  
  1015. key_chk6:
  1016.     btst.b    #0,7(a0)        *ROLL UPが押されたか?
  1017.     beq    key_chk8
  1018.     tst.b    inkey_flg1
  1019.     bne    key_chk9
  1020.     st    inkey_flg1
  1021.     bsr    crt_change
  1022.     bra    key_chk9
  1023.  
  1024. key_chk8:
  1025.     sf    inkey_flg1
  1026.  
  1027. key_chk9:
  1028.     rts
  1029.  
  1030. *****************************************************************
  1031. *    カーソル入力チェック                    *
  1032. *****************************************************************
  1033. cursor_chk:
  1034.     movea.w    #$807,a0        *カーソルキーのチェック
  1035.     move.b    (a0),d0
  1036.     ror.b    #3,d0
  1037.     andi.w    #$000f,d0
  1038.     move.b    d0,scroll_key
  1039.     rts
  1040.  
  1041. *****************************************************************
  1042. *    テンキー入力チェック                    *
  1043. *****************************************************************
  1044. tenkey_chk:
  1045.     movea.w    #$808,a0
  1046.     lea.l    scroll_key(pc),a1
  1047.     btst.b    #4,(a0)            *8押されたか?
  1048.     beq    tenkey_chk0        *押されていない
  1049.     or.b    #2,(a1)            *上セット
  1050. tenkey_chk0:
  1051.     btst.b    #7,(a0)            *4が押されたか?
  1052.     beq    tenkey_chk1        *押されていない
  1053.     or.b    #1,(a1)            *右セット
  1054. tenkey_chk1:
  1055.     movea.w    #$809,a0
  1056.     btst.b    #1,(a0)            *6が押されたか?
  1057.     beq    tenkey_chk2        *押されていない
  1058.     or.b    #4,(a1)            *左セット
  1059. tenkey_chk2:
  1060.     btst.b    #4,(a0)            *2が押されたか?
  1061.     beq    tenkey_chk3        *押されていない
  1062.     or.b    #8,(a1)            *下セット
  1063. tenkey_chk3:
  1064.     rts
  1065.  
  1066. *****************************************************************
  1067. *    マウスの入力チェック                    *
  1068. *****************************************************************
  1069. mouse_chk:
  1070.     IOCS    _MS_GETDT        *マウスからのデータをGET
  1071.  
  1072.     cmpi.b    #$ff,d0            *右ボタンが押されたか
  1073.     beq    mouse_right        *押された
  1074.     andi.w    #$ff00,d0        *左ボタンが押されたか
  1075.     bne    mouse_left        *押された
  1076.     sf    inkey_flg2
  1077.     bra    mouse_chk1
  1078.  
  1079. mouse_right:
  1080.     andi.w    #$ff00,d0        *更に左ボタンが押されたか
  1081.     bne    mouse_right1        *押された
  1082.  
  1083.     tst.b    inkey_flg2
  1084.     bne    mouse_right0
  1085.     st    inkey_flg2
  1086.     bsr    inf_change        *情報表示の変更
  1087.  
  1088. mouse_right0:
  1089.     IOCS    _MS_GETDT        *マウスからのデータをGET
  1090.     andi.w    #$ff00,d0        *左ボタンが押されたか
  1091.     beq    mouse_chk1        *押されていない
  1092.  
  1093. mouse_right1:
  1094.     st    esc_flg            *ESCスイッチON
  1095.     bra    mouse_chk1
  1096.  
  1097. mouse_left:
  1098.     st    next_flg        *NEXTスイッチON
  1099.  
  1100. mouse_chk1:
  1101.     swap    d0
  1102.     move.w    d0,d1
  1103.     andi.w    #$ff00,d0        *上位を残す
  1104.     andi.w    #$00ff,d1        *下位を残す
  1105.     ror.w    #8,d0            *
  1106.     lea.l    scroll_key(pc),a1
  1107.  
  1108. ms_xp:                    *X方向の移動量を調べる
  1109.     tst.b    d0            *移動量がプラス方向か?
  1110.     beq    ms_yp            *入力なし
  1111.     blt    ms_xm            *マイナスなら飛ぶ
  1112.  
  1113.     cmp.b    #1,d0
  1114.     bls    ms_yp            *移動量が少なければ無視
  1115.     or.b    #4,(a1)            *右セット
  1116.     bra    ms_yp
  1117. ms_xm:
  1118.     cmp.b    #-1,d0
  1119.     bcc    ms_yp
  1120.     or.b    #1,(a1)            *左セット
  1121. *    bra    ms_yp
  1122.  
  1123. ms_yp:                    *Y方向の移動量を調べる
  1124.     tst.b    d1            *移動量がプラス方向か?
  1125.     beq    mouse_chk9        *入力なし
  1126.     blt    ms_ym            *マイナスなら飛ぶ
  1127.  
  1128.     cmp.b    #1,d1
  1129.     bls    mouse_chk9        *移動量が少なければ無視
  1130.     or.b    #8,(a1)            *下セット
  1131.     bra    mouse_chk9
  1132. ms_ym:
  1133.     cmp.b    #-1,d1
  1134.     bcc    mouse_chk9
  1135.     or.b    #2,(a1)            *上セット
  1136. *    bra    mouse_chk9
  1137. mouse_chk9:
  1138.     rts
  1139.  
  1140. *****************************************************************
  1141. *    下方向へ全画面スクロールを行う                *
  1142. *****************************************************************
  1143. down_demo:
  1144.     tst.w    y_max
  1145.     beq    down_demo9
  1146.  
  1147.     move.w    s_dot24(pc),-(sp)
  1148.     lsr.w    s_dot24
  1149. down_demo0:
  1150.     bsr    key_chk
  1151.     bsr    cursor_chk
  1152.     bsr    tenkey_chk
  1153.     bsr    mouse_chk
  1154.     tst.b    scroll_key
  1155.     bne    down_demo8
  1156.     tst.b    esc_flg
  1157.     bne    down_demo8
  1158.     tst.b    next_flg
  1159.     bne    down_demo8
  1160.  
  1161.     bsr    v_wait
  1162.     bsr    down
  1163.     cmp.w    y_max(pc),d3
  1164.     bne    down_demo0
  1165. down_demo8:
  1166.     move.w    (sp)+,s_dot24
  1167. down_demo9:
  1168.     rts
  1169.  
  1170. *****************************************************************
  1171. *    右方向へ全画面スクロールを行う                *
  1172. *****************************************************************
  1173. right_demo:
  1174.     tst.w    x_max
  1175.     beq    right_demo9
  1176.     tst.w    d3
  1177.     bne    right_demo9
  1178. *    move.w    y_max(pc),d0
  1179. *    cmp.w    x_max(pc),d0
  1180. *    bhi    right_demo9
  1181.  
  1182.     move.w    s_dot24(pc),-(sp)
  1183.     lsr.w    s_dot24
  1184. right_demo0:
  1185.     bsr    key_chk
  1186.     bsr    cursor_chk
  1187.     bsr    tenkey_chk
  1188.     bsr    mouse_chk
  1189.     tst.b    scroll_key
  1190.     bne    right_demo8
  1191.     tst.b    esc_flg
  1192.     bne    right_demo8
  1193.     tst.b    next_flg
  1194.     bne    right_demo8
  1195.  
  1196.     bsr    v_wait
  1197.     bsr    right
  1198.     cmp.w    x_max(pc),d2
  1199.     bne    right_demo0
  1200. right_demo8:
  1201.     move.w    (sp)+,s_dot24
  1202. right_demo9:
  1203.     rts
  1204.  
  1205. *****************************************************************
  1206. *    スクロール                        *
  1207. *****************************************************************
  1208. go_scroll:
  1209.     moveq.l    #0,d0
  1210.     move.b    scroll_key(pc),d0
  1211.     add.w    d0,d0
  1212.     add.w    d0,d0
  1213.     movea.l    scroll_tbl(pc,d0.w),a0
  1214.     jsr    (a0)
  1215.     rts
  1216.  
  1217. scroll_tbl:
  1218.     .dc.l    null            *0000    入力無し
  1219.     .dc.l    left            *0001    左
  1220.     .dc.l    up            *0010    上
  1221.     .dc.l    left_up            *0011    上左
  1222.     .dc.l    right            *0100    右
  1223.     .dc.l    null            *0101    右左
  1224.     .dc.l    right_up        *0110    右上
  1225.     .dc.l    up            *0111    右上左
  1226.     .dc.l    down            *1000    下
  1227.     .dc.l    left_down        *1001    下左
  1228.     .dc.l    null            *1010    下上
  1229.     .dc.l    left            *1011    下上左
  1230.     .dc.l    right_down        *1100    下右
  1231.     .dc.l    down            *1101    下右左
  1232.     .dc.l    right            *1110    下右上
  1233.     .dc.l    null            *1111    下右上左
  1234.     .even
  1235.  
  1236. *****************************************************************
  1237. *    入力無し                        *
  1238. *****************************************************************
  1239. null:
  1240.     rts
  1241.  
  1242. *****************************************************************
  1243. *    右下(手抜き)                        *
  1244. *****************************************************************
  1245. right_down:
  1246.     bsr    right
  1247.     bsr    down
  1248.     rts
  1249.  
  1250. *****************************************************************
  1251. *    左下(手抜き)                        *
  1252. *****************************************************************
  1253. left_down:
  1254.     bsr    left
  1255.     bsr    down
  1256.     rts
  1257.  
  1258. *****************************************************************
  1259. *    右上(手抜き)                        *
  1260. *****************************************************************
  1261. right_up:
  1262.     bsr    right
  1263.     bsr    up
  1264.     rts
  1265.  
  1266. *****************************************************************
  1267. *    左上(手抜き)                        *
  1268. *****************************************************************
  1269. left_up:
  1270.     bsr    left
  1271.     bsr    up
  1272.     rts
  1273.  
  1274. *****************************************************************
  1275. *    左へ                            *
  1276. *****************************************************************
  1277. left:
  1278.     sub.w    s_dot24(pc),d2
  1279.     tst.w    d2
  1280.     bpl    left1
  1281.     clr.w    d2
  1282. left1:
  1283.     bsr    x_set
  1284.  
  1285.     move.w    x_old(pc),d5        *何ドットずらすか
  1286.     sub.w    d2,d5
  1287.     beq    left9
  1288.  
  1289.     move.w    d2,d0            *表示開始X座標
  1290.     add.w    x_pos(pc),d0
  1291.     and.w    #$1ff,d0
  1292.     move.w    d0,gram_x
  1293.  
  1294.     move.w    y_old(pc),d0        *表示開始Y座標
  1295.     add.w    y_pos(pc),d0
  1296.     and.w    #$1ff,d0
  1297.     move.w    d0,gram_y
  1298.  
  1299.     move.w    d2,glx_x
  1300.     move.w    d5,glx_xd
  1301.     move.w    y_old(pc),glx_y
  1302.     move.w    y_line(pc),glx_yd
  1303.  
  1304.     bsr    get_glx_addr        *表示
  1305.     bsr    get_gram_addr
  1306.     bsr    g24
  1307.  
  1308.     move.w    d2,x_old
  1309. left9:
  1310.     rts
  1311.  
  1312. *****************************************************************
  1313. *    上へ                            *
  1314. *****************************************************************
  1315. up:
  1316.     sub.w    s_dot24(pc),d3
  1317.     tst.w    d3
  1318.     bpl    up1
  1319.     clr.w    d3
  1320. up1:
  1321.     move.w    y_old(pc),d6        *何ドットずらすか
  1322.     sub.w    d3,d6
  1323.     beq    up9
  1324.  
  1325.     move.w    x_old(pc),d0        *表示開始X座標
  1326.     add.w    x_pos(pc),d0
  1327.     and.w    #$1ff,d0
  1328.     move.w    d0,gram_x
  1329.  
  1330.     move.w    d3,d0            *表示開始Y座標
  1331.     add.w    y_pos(pc),d0
  1332.     and.w    #$1ff,d0
  1333.     move.w    d0,gram_y
  1334.  
  1335.     move.w    x_old(pc),glx_x
  1336.     move.w    x_line(pc),glx_xd
  1337.     move.w    d3,glx_y
  1338.     move.w    d6,glx_yd
  1339.  
  1340.     bsr    get_glx_addr
  1341.     bsr    get_gram_addr
  1342.     bsr    g24
  1343.  
  1344.     bsr    y_set
  1345.  
  1346.     move.w    d3,y_old
  1347. up9:
  1348.     rts
  1349.  
  1350. *****************************************************************
  1351. *    右へ                            *
  1352. *****************************************************************
  1353. right:
  1354.     add.w    s_dot24(pc),d2
  1355.     cmp.w    x_max(pc),d2
  1356.     bls    right1
  1357.     move.w    x_max(pc),d2
  1358. right1:
  1359.     bsr    x_set
  1360.  
  1361.     move.w    d2,d5            *何ドットずらすか
  1362.     sub.w    x_old(pc),d5
  1363.     beq    right9
  1364.  
  1365.     move.w    x_old(pc),d0        *表示開始X座標
  1366.     add.w    x_pos(pc),d0
  1367.     add.w    #512,d0
  1368.     and.w    #$1ff,d0
  1369.     move.w    d0,gram_x
  1370.  
  1371.     move.w    y_old(pc),d0        *表示開始Y座標
  1372.     add.w    y_pos(pc),d0
  1373.     and.w    #$1ff,d0
  1374.     move.w    d0,gram_y
  1375.  
  1376.     move.w    x_old(pc),glx_x
  1377.     add.w    #512,glx_x
  1378.     move.w    d5,glx_xd
  1379.     move.w    y_old(pc),glx_y
  1380.     move.w    y_line(pc),glx_yd
  1381.  
  1382.     bsr    get_glx_addr        *表示
  1383.     bsr    get_gram_addr
  1384.     bsr    g24
  1385.  
  1386.     move.w    d2,x_old
  1387. right9:
  1388.     rts
  1389.  
  1390. *****************************************************************
  1391. *    下へ                            *
  1392. *****************************************************************
  1393. down:
  1394.     add.w    s_dot24(pc),d3
  1395.     cmp.w    y_max(pc),d3
  1396.     bls    down1
  1397.     move.w    y_max(pc),d3
  1398. down1:
  1399.     bsr    y_set
  1400.  
  1401.     move.w    d3,d6            *何ドットずらすか
  1402.     sub.w    y_old(pc),d6
  1403.     beq    down9
  1404.  
  1405.     move.w    x_old(pc),d0        *表示開始X座標
  1406.     add.w    x_pos(pc),d0
  1407.     and.w    #$1ff,d0
  1408.     move.w    d0,gram_x
  1409.  
  1410.     move.w    y_old(pc),d0        *表示開始Y座標
  1411.     add.w    y_pos(pc),d0
  1412.     and.w    #$1ff,d0
  1413.     move.w    d0,gram_y
  1414.  
  1415.     move.w    x_old(pc),glx_x
  1416.     move.w    x_line(pc),glx_xd
  1417.     move.w    y_old(pc),glx_y
  1418.     add.w    #512,glx_y
  1419.     move.w    d6,glx_yd
  1420.  
  1421.     bsr    get_glx_addr        *表示
  1422.     bsr    get_gram_addr
  1423.     bsr    g24
  1424.  
  1425.     move.w    d3,y_old
  1426. down9:
  1427.     rts
  1428.  
  1429. *****************************************************************
  1430. *    終了時に画面を描き直す                    *
  1431. *****************************************************************
  1432. rw_chk:
  1433.     tst.b    rflg
  1434.     beq    rw_end
  1435.     tst.b    skip_flg
  1436.     bne    rw_end
  1437.     tst.b    resize_flg
  1438.     bne    rw_end
  1439.  
  1440.     move.w    d2,d0
  1441.     add.w    d3,d0
  1442.     beq    rw_end
  1443.  
  1444.     bsr    quit_rewrite
  1445. rw_end:
  1446.     rts
  1447.  
  1448. *****************************************************************
  1449. *    一画面表示                        *
  1450. *****************************************************************
  1451. resize:
  1452.     bsr    parm_set
  1453.     pea.l    arg_ptr(pc)
  1454.     bsr    _Gxput
  1455.     addq.l    #4,sp
  1456.     rts
  1457.  
  1458. parm_set:
  1459.     lea.l    arg_ptr(pc),a0
  1460.  
  1461.     bsr    resize_get
  1462.     move.w    d0,4(a0)
  1463.     move.w    d1,6(a0)
  1464.  
  1465.     clr.w    gram_x
  1466.     clr.w    gram_y
  1467.  
  1468.     move.w    #512,d2            *X方向のセンタリング
  1469.     sub.w    d0,d2
  1470.     bmi    parm_set0
  1471.     lsr.w    #1,d2
  1472.     move.w    d2,gram_x
  1473. parm_set0:
  1474.     move.w    #512,d3            *Y方向
  1475.     sub.w    d1,d3
  1476.     bmi    parm_set1
  1477.     lsr.w    #1,d3
  1478.     move.w    d3,gram_y
  1479. parm_set1:
  1480.     bsr    get_gram_addr
  1481.     move.l    a2,(a0)
  1482.     addq.l    #8,a0
  1483.  
  1484.     clr.w    glx_x
  1485.     clr.w    glx_y
  1486.     bsr    get_glx_addr
  1487.     move.l    a1,(a0)+
  1488.  
  1489.     move.w    yoko(pc),(a0)+
  1490.     move.w    tate(pc),(a0)+
  1491.  
  1492.     move.w    line_byte(pc),(a0)+
  1493.  
  1494.     lea.l    work_tbl(pc),a1
  1495.     move.l    a1,(a0)+
  1496.     rts
  1497.  
  1498. resize_get:
  1499.     move.w    tate(pc),d0        *縦サイズと横サイズを比べる
  1500.     cmp.w    yoko(pc),d0
  1501.     beq    resize_get2
  1502.     bhi    resize_get1
  1503.  
  1504. resize_get0:
  1505.     move.w    #512,d0            *横の方が大きい
  1506.     move.w    tate(pc),d1
  1507.     mulu.w    #512,d1
  1508.     divu.w    yoko(pc),d1
  1509.     rts
  1510.  
  1511. resize_get1:
  1512.     move.w    yoko(pc),d0        *縦の方が大きい
  1513.     mulu.w    #512,d0
  1514.     divu.w    tate(pc),d0
  1515.     move.w    #512,d1
  1516.     rts
  1517.  
  1518. resize_get2:
  1519.     move.w    #512,d0            *同じ
  1520.     move.w    #512,d1
  1521.     rts
  1522.  
  1523. *****************************************************************
  1524. *    一画面表示後の描き戻し                    *
  1525. *****************************************************************
  1526. rewrite:
  1527.     move.w    x_old(pc),d2
  1528.     move.w    y_old(pc),d3
  1529.  
  1530.     move.w    d2,d0            *表示開始X座標
  1531.     add.w    x_pos(pc),d0
  1532.     and.w    #$1ff,d0
  1533.     move.w    d0,gram_x
  1534.  
  1535.     move.w    d3,d0            *表示開始Y座標
  1536.     add.w    y_pos(pc),d0
  1537.     and.w    #$1ff,d0
  1538.     move.w    d0,gram_y
  1539.  
  1540.     move.w    d2,glx_x
  1541.     move.w    x_line(pc),glx_xd
  1542.     move.w    d3,glx_y
  1543.     move.w    y_line(pc),glx_yd
  1544.  
  1545.     bsr    get_glx_addr        *表示
  1546.     bsr    get_gram_addr
  1547.     bsr    x_set
  1548.     bsr    y_set
  1549.     bsr    g24
  1550.     rts
  1551.  
  1552. *****************************************************************
  1553. *    終了時の描き戻し                    *
  1554. *****************************************************************
  1555. quit_rewrite:
  1556.     move.w    x_pos(pc),gram_x    *表示開始X座標
  1557.     move.w    y_pos(pc),gram_y    *表示開始Y座標
  1558.  
  1559.     move.w    d2,glx_x
  1560.     move.w    x_line(pc),glx_xd
  1561.     move.w    d3,glx_y
  1562.     move.w    y_line(pc),glx_yd
  1563.  
  1564.     clr.w    d2
  1565.     clr.w    d3
  1566.  
  1567.     bsr    get_glx_addr        *表示
  1568.     bsr    get_gram_addr
  1569.     bsr    x_set
  1570.     bsr    y_set
  1571.     bsr    g24
  1572.     rts
  1573.  
  1574. *****************************************************************
  1575. *    スクロール分のグラフィックを表示する            *
  1576. *    gram_x, gram_y  表示先座標(GRAM)            *
  1577. *    glx_x,  glx_y   表示元座標(GLX)                *
  1578. *    glx_xd, glx_yd  ドット数                *
  1579. *****************************************************************
  1580. g24:
  1581.     movem.l    d5-d6,-(sp)
  1582.     move.w    glx_xd(pc),d0        *横ドット数
  1583.     move.w    glx_yd(pc),d7        *縦ドット数
  1584.  
  1585.     moveq.l    #0,d4            *次のラインへのバイト数
  1586.     move.w    line_byte(pc),d4    *(転送元)
  1587.     sub.w    d0,d4
  1588.     sub.w    d0,d4
  1589.  
  1590.     moveq.l    #0,d5            *表示データの1ライン下までの差分
  1591.     move.w    #512,d5            *(表示先)
  1592.     sub.w    d0,d5
  1593.     add.w    d5,d5
  1594.  
  1595.     move.w    gram_x(pc),d6
  1596.     add.w    glx_xd(pc),d6
  1597.     cmp.w    #512,d6
  1598.     bhi    g24_2            *左右2回に分けて表示
  1599.  
  1600.     cmp.w    #1,d0            *表示ライン=横1ドット
  1601.     beq    g24_1
  1602.  
  1603.     cmp.w    #8,d0            *表示ライン=横8ドット
  1604.     beq    g24_8
  1605.  
  1606.     btst.l    #0,d0
  1607.     beq    g24_g            *表示ライン=偶数
  1608.     bra    g24_k            *表示ライン=奇数
  1609.  
  1610. g24_1:
  1611.     subq.w    #1,d7            *dbraのため縦-1
  1612. g24_11:
  1613.     move.w    (a1)+,(a2)+
  1614.     adda.l    d4,a1            *変換元アドレス更新
  1615.     adda.l    d5,a2            *表示先アドレス更新
  1616.     cmpa.l    a3,a2
  1617.     bcs    g24_13
  1618.     suba.l    #GRAM_MAX-GRAM,a2
  1619. g24_13:
  1620.     dbra    d7,g24_11
  1621.     bra    g24_end
  1622.  
  1623. g24_8:
  1624.     subq.w    #1,d7            *dbraのため縦-1
  1625. g24_81:
  1626.     move.l    (a1)+,(a2)+
  1627.     move.l    (a1)+,(a2)+
  1628.     move.l    (a1)+,(a2)+
  1629.     move.l    (a1)+,(a2)+
  1630.     adda.l    d4,a1            *変換元アドレス更新
  1631.     adda.l    d5,a2            *表示先アドレス更新
  1632.     cmpa.l    a3,a2
  1633.     bcs    g24_83
  1634.     suba.l    #GRAM_MAX-GRAM,a2
  1635. g24_83:
  1636.     dbra    d7,g24_81
  1637.     bra    g24_end
  1638.  
  1639. g24_g:
  1640.     lsr.w    #1,d0            *1/2
  1641.     subq.w    #1,d0            *dbraのため-1
  1642.     subq.w    #1,d7            *dbraのため-1
  1643. g24_g1:
  1644.     move.w    d0,d1
  1645. g24_g2:
  1646.     move.l    (a1)+,(a2)+
  1647.     dbra    d1,g24_g2
  1648.     adda.l    d4,a1            *変換元アドレス更新
  1649.     adda.l    d5,a2            *表示先アドレス更新
  1650.     cmpa.l    a3,a2
  1651.     bcs    g24_g3
  1652.     suba.l    #GRAM_MAX-GRAM,a2
  1653. g24_g3:
  1654.     dbra    d7,g24_g1
  1655.     bra    g24_end
  1656.  
  1657. g24_k:
  1658.     lsr.w    #1,d0            *1/2
  1659.     subq.w    #1,d0            *dbraのため-1
  1660.     subq.w    #1,d7            *dbraのため-1
  1661. g24_k1:
  1662.     move.w    d0,d1
  1663. g24_k2:
  1664.     move.l    (a1)+,(a2)+
  1665.     dbra    d1,g24_k2
  1666.     move.w    (a1)+,(a2)+
  1667.     adda.l    d4,a1            *変換元アドレス更新
  1668.     adda.l    d5,a2            *表示先アドレス更新
  1669.     cmpa.l    a3,a2
  1670.     bcs    g24_k3
  1671.     suba.l    #GRAM_MAX-GRAM,a2
  1672. g24_k3:
  1673.     dbra    d7,g24_k1
  1674.     bra    g24_end
  1675.  
  1676. g24_2:                    *左右2回に分けて表示
  1677.     add.w    #1024,d5        *1ライン下までの差分を補正
  1678.  
  1679.     move.w    #512,d0            *横ドット1
  1680.     sub.w    gram_x(pc),d0
  1681.     move.w    glx_xd(pc),d6        *横ドット2
  1682.     sub.w    d0,d6
  1683.  
  1684.     subq.w    #1,d0            *dbraのため-1
  1685.     subq.w    #1,d6            *dbraのため-1
  1686.     subq.w    #1,d7            *dbraのため-1
  1687. g24_21:
  1688.     move.w    d0,d1            *右側
  1689. g24_22:
  1690.     move.w    (a1)+,(a2)+
  1691.     dbra    d1,g24_22
  1692. g24_23:
  1693.     move.w    d6,d1            *左側
  1694.     lea.l    -1024(a2),a2
  1695. g24_24:
  1696.     move.w    (a1)+,(a2)+
  1697.     dbra    d1,g24_24
  1698.  
  1699.     adda.l    d4,a1            *変換元アドレス更新
  1700.     adda.l    d5,a2            *表示先アドレス更新
  1701.     cmpa.l    a3,a2
  1702.     bcs    g24_25
  1703.     suba.l    #GRAM_MAX-GRAM,a2
  1704. g24_25:
  1705.     dbra    d7,g24_21
  1706.  
  1707. g24_end:
  1708.     movem.l    (sp)+,d5-d6
  1709.     rts
  1710.  
  1711. *****************************************************************
  1712. *    GLXデータのアドレスを取得(a1)                *
  1713. *****************************************************************
  1714. get_glx_addr:
  1715.     move.w    line_byte(pc),d0    *line_byte*glx_y + gr_addr + glx_x*2
  1716.     mulu.w    glx_y(pc),d0
  1717.     add.l    gr_addr(pc),d0
  1718.     movea.l    d0,a1
  1719.     moveq.l    #0,d0
  1720.     move.w    glx_x(pc),d0
  1721.     add.w    d0,d0
  1722.     adda.l    d0,a1
  1723.     rts
  1724.  
  1725. *****************************************************************
  1726. *    GRAMのアドレスを取得(a2)                *
  1727. *****************************************************************
  1728. get_gram_addr:
  1729.     move.w    gram_x(pc),d0        *表示先画像アドレス
  1730.     move.w    gram_y(pc),d1
  1731.     swap.w    d1
  1732.     clr.w    d1
  1733.     ror.l    #6,d1
  1734.     add.w    d0,d0
  1735.     add.w    d0,d1
  1736.     movea.l    d1,a2
  1737.     adda.l    #GRAM,a2
  1738.  
  1739.     movea.l    #GRAM_MAX,a3        *GRAM_MAX
  1740.     rts
  1741.  
  1742. *****************************************************************
  1743. *    画面モード変更                        *
  1744. *****************************************************************
  1745. crt_change:                *ROLL UP
  1746.     addq.w    #1,crt_mode
  1747.     move.w    crt_max(pc),d0
  1748.     cmp.w    crt_mode(pc),d0
  1749.     bcc    crt_change1
  1750.     clr.w    crt_mode
  1751.     bra    crt_change1
  1752. crt_change0:                *ROLL DOWN
  1753.     subq.w    #1,crt_mode
  1754.     bpl    crt_change1
  1755.     move.w    crt_max(pc),crt_mode
  1756.     bra    crt_change1
  1757. crt_change1:
  1758.  
  1759.     bsr    gr_off0
  1760.     bsr    crtc_set
  1761.     bsr    gr_on0
  1762.     rts
  1763.  
  1764. *****************************************************************
  1765. *    CRTCの値を設定する                    *
  1766. *****************************************************************
  1767. crtc_set:
  1768.     lea.l    crtc_tbl(pc),a0
  1769.     move.w    crt_mode(pc),d0
  1770.     add.w    d0,d0
  1771.     add.w    d0,d0
  1772.     move.l    0(a0,d0.w),a0
  1773.  
  1774.     tst.w    (a0)+            *HRL=0?
  1775.     beq    crtc_set0
  1776.     or.b    #%0010,$e8e007        *HRLビットを立てる
  1777.     bra    crtc_set1
  1778. crtc_set0:
  1779.     bclr.b    #1,$e8e007        *HRLビットを消す
  1780. crtc_set1:
  1781.     movea.l    #$e80000,a1
  1782.     move.w    (a0)+,$28(a1)        *crtc r20
  1783.  
  1784.     move.l    (a0)+,(a1)+        *crtc r00-r08
  1785.     move.l    (a0)+,(a1)+
  1786.     move.l    (a0)+,(a1)+
  1787.     move.l    (a0)+,(a1)+
  1788.     move.w    (a0),(a1)
  1789.     rts
  1790.  
  1791. *****************************************************************
  1792. *    情報の表示/非表示の変更を行う                *
  1793. *****************************************************************
  1794. inf_change:
  1795.     add.b    #1,prt_flg
  1796.     cmp.b    #2,prt_flg
  1797.     bcs    inf_change1
  1798.     beq    inf_change2
  1799.     bra    inf_change0
  1800.  
  1801. inf_change0:
  1802. *    bsr    v_wait
  1803.     bsr    inf_off            *情報消去
  1804.     bsr    tone_up
  1805.     clr.b    prt_flg
  1806.     bra    inf_change9
  1807. inf_change1:
  1808. *    bsr    v_wait
  1809.     bsr    inf_prt            *情報表示
  1810.     bra    inf_change9
  1811. inf_change2:
  1812. *    bsr    v_wait
  1813.     bsr    tone_down
  1814. inf_change9:
  1815.     rts
  1816.  
  1817. inf_mode:
  1818.     cmp.b    #1,prt_flg
  1819.     bcs    inf_mode9
  1820.     beq    inf_mode1
  1821.     bra    inf_mode2
  1822. inf_mode1:
  1823.     bsr    inf_prt            *情報表示
  1824.     bra    inf_mode9
  1825. inf_mode2:
  1826.     bsr    inf_prt            *情報表示
  1827.     bsr    tone_down
  1828. inf_mode9:
  1829.     rts
  1830.  
  1831. *****************************************************************
  1832. *    情報の表示                        *
  1833. *****************************************************************
  1834. inf_prt:
  1835.     tst.b    prt_flg
  1836.     beq    inf_prt9        *ゼロなら表示しない
  1837.  
  1838.     bsr    v_wait
  1839.     bsr    inf_off
  1840.     bsr    name_prt        *ファイル名の表示
  1841.     bsr    size_prt        *サイズの表示
  1842. *    bsr    col_prt            *色数の表示
  1843. inf_prt9:
  1844.     rts
  1845.  
  1846. *****************************************************************
  1847. *    ファイル名の表示                    *
  1848. *****************************************************************
  1849. name_prt:
  1850.     lea.l    prt_buf(pc),a0        *表示バッファの先頭アドレス
  1851.     lea.l    inf1(pc),a1        *'ファイル名:'をコピー
  1852.     bsr    strcpy
  1853.  
  1854.     lea.l    filbuf(pc),a1        *ファイル名をコピーする
  1855.     lea.l    30(a1),a1        *
  1856.     bsr    strcpy
  1857.  
  1858.     lea.l    crlf_mes(pc),a1        *改行コードをコピー
  1859.     bsr    strcpy
  1860.  
  1861.     lea.l    prt_buf(pc),a1
  1862.     IOCS    _B_PRINT        *ファイル名を表示
  1863.     rts
  1864.  
  1865. *****************************************************************
  1866. *    画像サイズの表示                    *
  1867. *****************************************************************
  1868. size_prt:
  1869.     lea.l    prt_buf(pc),a0        *コピー先
  1870.     lea.l    inf2(pc),a1        *'画像サイズ:'をコピー
  1871.     bsr    strcpy
  1872.  
  1873.     movea.l    a0,a2
  1874.     moveq.l    #0,d0            *横サイズ
  1875.     move.w    yoko(pc),d0
  1876.     bsr    suji_set
  1877.     move.b    #'x',(a2)+        *'x'
  1878.  
  1879.     moveq.l    #0,d0            *縦サイズ
  1880.     move.w    tate(pc),d0
  1881.     bsr    suji_set
  1882.  
  1883.     movea.l    a2,a0
  1884.     lea.l    crlf_mes(pc),a1        *改行コードをコピー
  1885.     bsr    strcpy
  1886.  
  1887.     lea.l    prt_buf(pc),a1
  1888.     IOCS    _B_PRINT        *画像サイズを表示
  1889.     rts
  1890.  
  1891. *****************************************************************
  1892. *    階調のUP・DOWN                        *
  1893. *****************************************************************
  1894. tone_up:
  1895.     andi.w    #$00ff,$e82600        *半輝度オフ
  1896.     rts
  1897.  
  1898. tone_down:
  1899.     ori.w    #$1b00,$e82600        *半輝度オン(参考:JPEGED.R)
  1900.     rts
  1901.  
  1902. *****************************************************************
  1903. *    数字の設定                        *
  1904. *****************************************************************
  1905. suji_set:
  1906.     lea.l    num_buf(pc),a0
  1907.     move.b    #0,11(a0)        *終了位置
  1908.     bsr    bin2dec
  1909.     bsr    zero_keshi
  1910. suji_set1:
  1911.     move.b    (a0)+,(a2)+
  1912.     bne    suji_set1
  1913.     subq.l    #1,a2
  1914.     rts
  1915.  
  1916. *****************************************************************
  1917. *    2進=>10進                        *
  1918. *    d0 変換元の数値 a0 変換後の格納アドレス            *
  1919. *****************************************************************
  1920. bin2dec:
  1921.     movem.l    d0-d3/a0-a1,-(sp)
  1922.     moveq.l    #10-1,d1
  1923.     lea.l    exp_tbl(pc),a1
  1924. bin2dec0:
  1925.     clr.b    d2
  1926.     move.l    (a1)+,d3
  1927. bin2dec1:
  1928.     or    d3,d3
  1929.     sub.l    d3,d0
  1930.     bcs    bin2dec2
  1931.     addq.b    #1,d2
  1932.     bra    bin2dec1
  1933. bin2dec2:
  1934.     add.l    d3,d0
  1935.     add.b    #'0',d2
  1936.     move.b    d2,(a0)+
  1937.     dbra    d1,bin2dec0
  1938.     movem.l    (sp)+,d0-d3/a0-a1
  1939.     rts
  1940.  
  1941. exp_tbl:
  1942.     .dc.l    1000000000
  1943.     .dc.l    100000000
  1944.     .dc.l    10000000
  1945.     .dc.l    1000000
  1946.     .dc.l    100000
  1947.     .dc.l    10000
  1948.     .dc.l    1000
  1949.     .dc.l    100
  1950.     .dc.l    10
  1951.     .dc.l    1
  1952.  
  1953. *****************************************************************
  1954. *    頭にある'0'を消す                    *
  1955. *****************************************************************
  1956. zero_keshi:
  1957.     lea.l    num_buf(pc),a0
  1958.     move.w    #9-1,d0            *最期の'0'は残す
  1959. zero_keshi0:
  1960.     cmp.b    #'0',(a0)
  1961.     bne    zero_keshi9
  1962.     move.b    #SPACE,(a0)+
  1963. zero_keshi1:
  1964.     dbra    d0,zero_keshi0
  1965. zero_keshi9:
  1966.     rts
  1967.  
  1968. *****************************************************************
  1969. *    情報の消去                        *
  1970. *****************************************************************
  1971. inf_off:
  1972.     move.w    #$1a,d1            *TEXTクリア&HOMEポジションへ
  1973.     IOCS    _B_PUTC
  1974.     rts
  1975.  
  1976. *****************************************************************
  1977. *    スクロールX座標セット                    *
  1978. *****************************************************************
  1979. x_set:
  1980.     movea.l    #$e80000,a0
  1981.     move.w    d2,crtc_r12(a0)
  1982.     move.w    d2,crtc_r14(a0)
  1983.     move.w    d2,crtc_r16(a0)
  1984.     move.w    d2,crtc_r18(a0)
  1985.     rts
  1986.  
  1987. *****************************************************************
  1988. *    スクロールY座標セット                    *
  1989. *****************************************************************
  1990. y_set:
  1991.     movea.l    #$e80000,a0
  1992.     move.w    d3,crtc_r13(a0)        *スクリーン0のY座標
  1993.     move.w    d3,crtc_r15(a0)        *スクリーン1のY座標
  1994.     move.w    d3,crtc_r17(a0)        *スクリーン2のY座標
  1995.     move.w    d3,crtc_r19(a0)        *スクリーン3のY座標
  1996.     rts
  1997.  
  1998. *****************************************************************
  1999. *    画面の動機待ち                        *
  2000. *****************************************************************
  2001. v_wait:
  2002.     movea.l    #$e88001,a0
  2003.     moveq.l    #4,d0
  2004. v_wait0:
  2005.     btst.b    d0,(a0)
  2006.     beq    v_wait0
  2007. v_wait1:
  2008.     btst.b    d0,(a0)
  2009.     bne    v_wait1
  2010.     rts
  2011.  
  2012. *****************************************************************
  2013. *    テキスト画面の消去                    *
  2014. *****************************************************************
  2015. text_clr:
  2016.     movem.l    d0-d3/a3,-(sp)
  2017.     move.w    $E8002A,d0
  2018.     move.w    #%0000_0001_1111_0000,$E8002A
  2019.     movea.l    #TEXT1,a3
  2020.     move.w    #1024-1,d1
  2021. text_clr_lp:
  2022.     clr.l    (a3)+
  2023.     dbra.w    d1,text_clr_lp
  2024.     move.w    d0,$E8002A
  2025.  
  2026.     move.w    #$0001,d1
  2027.     move.w    #255,d2
  2028.     move.w    #$000F,d3
  2029.     IOCS    _TXRASCPY
  2030.     movem.l    (sp)+,d0-d3/a3
  2031.     rts
  2032.  
  2033. *****************************************************************
  2034. *    カーソル消す                        *
  2035. *****************************************************************
  2036. cursol_clr:
  2037.     move.b    $992.w,cur_save
  2038.     beq    cursol_clr9
  2039.     IOCS    _OS_CUROF
  2040.  
  2041. cursol_clr9:
  2042.     rts
  2043.  
  2044. *****************************************************************
  2045. *    カーソル戻す                        *
  2046. *****************************************************************
  2047. cursol_recv:
  2048.     tst.b    cur_save
  2049.     beq    cursol_recv9
  2050.     IOCS    _OS_CURON
  2051.  
  2052. cursol_recv9:
  2053.     rts
  2054.  
  2055. *****************************************************************
  2056. *    ファイルのOPENを行う                *
  2057. *****************************************************************
  2058. file_open:
  2059.     move.w    #0,-(sp)        *ファイルopen
  2060.     move.l    a0,-(sp)
  2061.     DOS    _OPEN
  2062.     addq.l    #6,sp
  2063.     tst.l    d0            *OK?
  2064.     bmi    open_err
  2065.     move.l    d0,d7            *ファイルハンドルセーブ
  2066.     rts
  2067.  
  2068. *****************************************************************
  2069. *    ファイルのサイズを求める(d6に返す)            *
  2070. *****************************************************************
  2071. file_size:
  2072.     move.w    #2,-(sp)
  2073.     move.l    #0,-(sp)
  2074.     move.w    d7,-(sp)
  2075.     DOS    _SEEK
  2076.     addq.l    #8,sp
  2077.     tst.l    d0            *OK?
  2078.     bmi    read_err
  2079.  
  2080.     move.l    d0,d6
  2081.  
  2082.     move.w    #0,-(sp)
  2083.     move.l    #0,-(sp)
  2084.     move.w    d7,-(sp)
  2085.     DOS    _SEEK
  2086.     addq.l    #8,sp
  2087.     tst.l    d0            *OK?
  2088.     bmi    read_err
  2089.     rts
  2090.  
  2091. *****************************************************************
  2092. *    ディスクからデータの読み込みを行う            *
  2093. *****************************************************************
  2094. file_read:
  2095.     move.l    d6,-(sp)        *データサイズ
  2096.     move.l    a4,-(sp)        *バッファアドレス
  2097.     move.w    d7,-(sp)        *ファイルハンドル
  2098.     DOS    _READ
  2099.     lea    10(sp),sp        *スタック補正
  2100.     tst.l    d0            *OK?
  2101.     bmi    read_err
  2102.     cmp.l    d6,d0            *全部読めたか
  2103.     bne    read_err
  2104.     rts
  2105.  
  2106. *****************************************************************
  2107. *    ファイルをCLOSEする                *
  2108. *****************************************************************
  2109. file_close:
  2110.     move.w    d7,-(sp)        *ファイルCLOSE
  2111.     DOS    _CLOSE
  2112.     addq.l    #2,sp
  2113.     rts
  2114.  
  2115. *****************************************************************
  2116. *    バッファ確保                        *
  2117. *****************************************************************
  2118. buf_get:
  2119.     pea.l    -1.w            *確保出来る最大サイズを取得
  2120.     DOS    _MALLOC
  2121.     addq.l    #4,sp
  2122.     andi.l    #$00ffffff,d0
  2123.     move.l    d0,d1
  2124.     move.l    d0,-(sp)
  2125.     DOS    _MALLOC
  2126.     addq.l    #4,sp
  2127.     tst.l    d0
  2128.     bmi    no_buff1
  2129.  
  2130.     move.l    d0,buff_addr        *バッファアドレス
  2131.     move.l    d1,buff_size        *バッファサイズ
  2132.     rts
  2133.  
  2134. *****************************************************************
  2135. *    バッファ開放                        *
  2136. *****************************************************************
  2137. buf_free:
  2138.     pea.l    buff_addr(pc)        *バッファ開放
  2139.     DOS    _MFREE
  2140.     addq.l    #4,sp
  2141.     rts
  2142.  
  2143. *****************************************************************
  2144. *    スーパーモードにする                    *
  2145. *****************************************************************
  2146. super:
  2147.     clr.l    -(sp)            *スーパーバイザモードへ移行
  2148.     DOS    _SUPER
  2149.     addq.l    #4,sp
  2150.     move.l    d0,sp_save
  2151.     rts
  2152.  
  2153. *****************************************************************
  2154. *    ユーザーモードにする                    *
  2155. *****************************************************************
  2156. user:
  2157.     move.l    sp_save(pc),-(sp)    *ユーザーモードへ
  2158.     DOS    _SUPER
  2159.     addq.l    #4,sp
  2160.     rts
  2161.  
  2162. *****************************************************************
  2163. *    ファンクション表示を消す                *
  2164. *****************************************************************
  2165. func_off:
  2166.     lea.l    func_off_mes(pc),a0
  2167.     bsr    mesput
  2168.     rts
  2169.  
  2170. *****************************************************************
  2171. *    処理したファイル数をチェックする            *
  2172. *****************************************************************
  2173. file_cnt_chk:
  2174.     tst.w    file_cnt        *処理したファイルは0個か
  2175.     bne    file_cnt_chk1        *違う
  2176.     bsr    no_file            *ファイルが無かった
  2177. file_cnt_chk1:
  2178.     rts
  2179.  
  2180. *****************************************************************
  2181. *    処理するファイルがなかった                *
  2182. *****************************************************************
  2183. no_file:
  2184.     lea.l    no_file_mes(pc),a0
  2185.     bsr    mesput
  2186.     rts
  2187.  
  2188. *****************************************************************
  2189. *    ファイル名エラー                    *
  2190. *****************************************************************
  2191. name_er:
  2192.     lea.l    name_er_mes(pc),a0
  2193.     bsr    mesput
  2194.     bra    exit2
  2195.  
  2196. *****************************************************************
  2197. *    メモリが全くない                    *
  2198. *****************************************************************
  2199. no_buff1:
  2200.     lea.l    no_buff_mes1(pc),a0
  2201.     bsr    mesput
  2202.     bra    exit2
  2203.  
  2204. *****************************************************************
  2205. *    メモリが足りない                    *
  2206. *****************************************************************
  2207. no_buff2:
  2208.     lea.l    arg1(pc),a0
  2209.     bsr    mesput
  2210.     lea.l    no_buff_mes2(pc),a0
  2211.     bsr    mesput
  2212.     rts
  2213.  
  2214. *****************************************************************
  2215. *    ロード座標エラー                    *
  2216. *****************************************************************
  2217. but_pos:
  2218.     bsr    file_close        *ファイルクローズ
  2219.     lea.l    arg1(pc),a0
  2220.     bsr    mesput
  2221.     lea.l    but_pos_mes(pc),a0
  2222.     bsr    mesput
  2223.     bra    exit2
  2224.  
  2225. *****************************************************************
  2226. *    ファイルが見付からない                    *
  2227. *****************************************************************
  2228. open_err:
  2229.     lea.l    arg1(pc),a0
  2230.     bsr    mesput
  2231.     lea.l    open_er_mes(pc),a0
  2232.     bsr    mesput
  2233.     bra    exit2
  2234.  
  2235. *****************************************************************
  2236. *    読み込みエラー                        *
  2237. *****************************************************************
  2238. read_err:
  2239.     lea.l    arg1(pc),a0
  2240.     bsr    mesput
  2241.     lea.l    read_er_mes(pc),a0
  2242.     bsr    mesput
  2243.     bra    exit2
  2244.  
  2245. *****************************************************************
  2246. *    使用方表示                        *
  2247. *****************************************************************
  2248. usage:
  2249.     lea.l    usage_mes(pc),a0
  2250.     bsr    mesput
  2251.     bra    exit2
  2252.  
  2253. *****************************************************************
  2254. *    メッセージ表示                        *
  2255. *****************************************************************
  2256. mesput:
  2257. *    move.w    #STDERR,-(sp)        *標準エラー出力へ
  2258.     move.w    #STDOUT,-(sp)        *標準出力へ
  2259.     move.l    a0,-(sp)        *メッセージを
  2260.     DOS    _FPUTS            *出力する
  2261.     addq.l    #6,sp            *スタック補正
  2262.     rts
  2263.  
  2264. *****************************************************************
  2265. *    終了処理                        *
  2266. *****************************************************************
  2267. exit:
  2268.     bsr    cursol_recv        *カーソル戻す
  2269.     IOCS    _MS_INIT        *キーバッファクリア
  2270.     moveq.l    #-1,d1
  2271.     IOCS    _SKEY_MOD
  2272.     move.w    #-1,-(sp)
  2273.     DOS    _KFLUSH
  2274.     addq.l    #2,sp
  2275.     rts
  2276.  
  2277. *****************************************************************
  2278. *    エラー処理2                        *
  2279. *****************************************************************
  2280. exit2:
  2281.     bsr    exit
  2282.     move.w    #1,-(sp)        *終了コード1を持って
  2283.     DOS    _EXIT2            * エラー終了
  2284.  
  2285. *****************************************************************
  2286. *    データエリア                        *
  2287. *****************************************************************
  2288.     .data
  2289.     .even
  2290. usage_mes:
  2291.     .dc.b    'GLx Loader V0.08+ by A.MUKAWA',CR,LF
  2292.     .dc.b    '機能:GL0,GL3,GLM,GLXファイルを表示します',CR,LF
  2293.     .dc.b    '用法:LDGLX [スイッチ] ファイル名',CR,LF
  2294.     .dc.b    CR,LF
  2295.     .dc.b    '             /L[x,y]   ロード座標の指定',CR,LF
  2296.     .dc.b    '             /LC       画面中央に表示',CR,LF
  2297.     .dc.b    '             /K        表示後にキー入力待ち',CR,LF
  2298.     .dc.b    '             /Sn       画面モードの設定(n=0~2)',CR,LF
  2299.     .dc.b    '                         n=0 512*512 31k 標準モード(DEF)',CR,LF
  2300.     .dc.b    '                         n=1 512*512 15k 標準モード',CR,LF
  2301.     .dc.b    '                         n=2 512*512 31k 正方形モード',CR,LF
  2302.     .dc.b    '             /Cn       画面クリアモードの設定(n=0~3)',CR,LF
  2303.     .dc.b    '                         0:画面消去を行わない',CR,LF
  2304.     .dc.b    '                         1:テキスト画面のみ消去(DEF)',CR,LF
  2305.     .dc.b    '                         2:グラフィック画面のみ消去',CR,LF
  2306.     .dc.b    '                         3:テキスト画面とグラフィック画面を消去',CR,LF
  2307.     .dc.b    '             /M        MPUに頑張ってもらう',CR,LF
  2308.     .dc.b    '             /R        終了時に画面を描き直す',CR,LF
  2309.     .dc.b    0
  2310. no_file_mes:
  2311.     .dc.b    '表示できるファイルがありません!',CR,LF,0
  2312. name_er_mes:
  2313.     .dc.b    'ファイル名の指定に間違いがあります!',CR,LF,0
  2314. open_er_mes:
  2315.     .dc.b    ' が見つかりません!',CR,LF,0
  2316. read_er_mes:
  2317.     .dc.b    ' の読み込みエラーが発生しました!',CR,LF,0
  2318. but_pos_mes:
  2319.     .dc.b    ' は指定した座標にロード出来ません!',CR,LF,0
  2320. not_glx_mes:
  2321.     .dc.b    ' は壊れているか、GLxファイルではありません!',CR,LF,0
  2322. not_ext_mes:
  2323.     .dc.b    ' はスキップします',CR,LF,0
  2324. no_buff_mes1:
  2325.     .dc.b    'メモリの余裕が全くありません!',CR,LF,0
  2326. no_buff_mes2:
  2327.     .dc.b    ' の表示に必要なメモリがありません!',CR,LF,0
  2328. crlf_mes:
  2329.     .dc.b    CR,LF,0
  2330. func_off_mes:
  2331.     .dc.b    $1b,$5b,$3e,$31,$68,0
  2332.  
  2333. dext:
  2334.     .dc.b    '.GL?',0        *補う拡張子
  2335. komekome:
  2336.     .dc.b    '\'
  2337. kome0:
  2338.     .dc.b    '*.GL?',0
  2339.     .even
  2340.  
  2341. kflg:    .dcb.b    1,0            */Kスイッチon/offフラグ(=0...off,<>0...on)
  2342. sflg:    .dcb.b    1,0            */Sスイッチon/offフラグ(=0...off,<>0...on)
  2343. cflg:    .dcb.b    1,0            */Cスイッチon/offフラグ(=0...off,<>0...on)
  2344. lflg:    .dcb.b    1,0            */Lスイッチon/offフラグ(=0...off,<>0...on)
  2345. lcflg:    .dcb.b    1,0            */LCスイッチon/offフラグ(=0...off,<>0...on)
  2346. mflg:    .dcb.b    1,0            */Mスイッチon/offフラグ(=0...off,<>0...on)
  2347. rflg:    .dcb.b    1,0            */Rスイッチon/offフラグ(=0...off,<>0...on)
  2348. int_flg:    .dcb.b    1,0        *
  2349. prt_flg:    .dcb.b    1,0        *画像情報の表示/非表示フラグ
  2350.  
  2351.     .even
  2352. s_dot24:
  2353.     .dcb.w    1,8
  2354.  
  2355. crt_max:
  2356.     .dc.w    3-1
  2357. crtc_tbl:
  2358.     .dc.l    mode0
  2359.     .dc.l    mode1
  2360.     .dc.l    mode2
  2361. crtc_data:
  2362. *        HRL  R20  R00  R01  R02  R03  R04  R05  R06  R07  R08
  2363. mode0:    .dc.w    $00,$315, $5B, $09, $11, $51,$237, $05, $28,$228, $1B    *512*512
  2364. mode1:    .dc.w    $00,$305, $4B, $03, $05, $45,$103, $02, $10,$100, $2C    *512*512 Low
  2365. mode2:    .dc.w    $00,$316, $89, $0E, $2C, $6C,$237, $05, $28,$228, $1B    *512*512 正方形 中央
  2366.  
  2367. dot_tbl:
  2368.     .dc.l    dot0
  2369.     .dc.l    dot1
  2370.     .dc.l    dot2
  2371.  
  2372. dot_data:
  2373. dot0:    .dc.w     512,512
  2374. dot1:    .dc.w     512,512
  2375. dot2:    .dc.w     512,512
  2376.  
  2377. inf1:    .dc.b    'ファイル名:',0
  2378. inf2:    .dc.b    '画像サイズ:',0
  2379.     .even
  2380.  
  2381. *****************************************************************
  2382. *    ワークエリア                        *
  2383. *****************************************************************
  2384.     .bss
  2385.     .even
  2386.  
  2387. filbuf:
  2388.     .ds.b    53            *ファイル情報格納バッファ
  2389. nambuf:
  2390.     .ds.b    92            *ファイル名展開用バッファ
  2391. arg1:
  2392.     .ds.b    256            *ファイル名バッファ
  2393. prt_buf:
  2394.     .ds.b    96+3            *画面表示バッファ
  2395. num_buf:
  2396.     .ds.b    10+1            *数値変換バッファ
  2397.     .even
  2398.  
  2399. ext_buff:
  2400.     .ds.l    1            *拡張子バッファ
  2401. file_cnt:
  2402.     .ds.w    1            *ファイル数のカウント用バッファ
  2403. sp_save:
  2404.     .ds.l    1
  2405. buff_addr:
  2406.     .ds.l    1            *画像読み込みバッファアドレス
  2407. buff_size:
  2408.     .ds.l    1            *画像読み込みバッファサイズ
  2409. gr_addr:
  2410.     .ds.l    1            *画像データアドレス
  2411. fi_size:
  2412.     .ds.l    1            *ファイルサイズ
  2413. yoko:
  2414.     .ds.w    1            *画像の横(X)サイズ
  2415. tate:
  2416.     .ds.w    1            *画像の縦(Y)サイズ
  2417. line_byte:
  2418.     .ds.w    1            *1ラインのバイト数
  2419. crt_mode:
  2420.     .ds.w    1            *画面モード
  2421. crt_x:
  2422.     .ds.w    1            *画面のXサイズ
  2423. crt_y:
  2424.     .ds.w    1            *画面のYサイズ
  2425. x_pos:
  2426.     .ds.w    1            *ロード時のX座標
  2427. y_pos:
  2428.     .ds.w    1            *ロード時のY座標
  2429. x_max:
  2430.     .ds.w    1            *横スクロール数
  2431. y_max:
  2432.     .ds.w    1            *縦スクロール数
  2433. clr_mode:
  2434.     .ds.w    1            *画面クリアモード
  2435. vctr_r0:
  2436.     .ds.w    1            
  2437. vctr_r2:
  2438.     .ds.w    1            
  2439. line_cnt:
  2440.     .ds.w    1
  2441. esc_flg:
  2442.     .ds.b    1            *
  2443. next_flg:
  2444.     .ds.b    1            *
  2445. resize_flg:
  2446.     .ds.b    1            *
  2447. inkey_flg1:
  2448.     .ds.b    1            *
  2449. inkey_flg2:
  2450.     .ds.b    1            *
  2451. inkey_flg3:
  2452.     .ds.b    1            *
  2453. skip_flg:
  2454.     .ds.b    1            *画像表示のスキップフラグ
  2455. scroll_key:
  2456.     .ds.b    1            *スクロール処理のキー
  2457. cur_save:
  2458.     .ds.b    1            *
  2459.     .even
  2460.  
  2461. gram_x    .ds.w    1            *表示する座標(GRAM)
  2462. gram_y    .ds.w    1
  2463.  
  2464. glx_x    .ds.w    1            *表示する座標(GLX)
  2465. glx_y    .ds.w    1
  2466. glx_xd    .ds.w    1            *表示するドット数
  2467. glx_yd    .ds.w    1
  2468.  
  2469. x_line:
  2470.     .ds.w    1            *横ドット数
  2471. y_line:
  2472.     .ds.w    1            *縦ドット数
  2473. x_old:
  2474.     .ds.w    1            *前回のX座標
  2475. y_old:
  2476.     .ds.w    1            *前回のY座標
  2477. arg_ptr:
  2478.     .ds.b    4+2*2+4+2*2+2+4
  2479. work_tbl:
  2480.     .ds.b    1024
  2481.  
  2482. my_stack:
  2483.     .ds.l    1024
  2484. mysp:
  2485.     .end    start
  2486.